package java_thinking.unit_18_IO._18_1;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;

/**
 * @Desc:   目录列表器
 * @author: cww
 * @DateTime: 2019-05-11 22:31
 */

public class DirList {
    public static void main(String[] args) {
        File path = new File(".");
        String[] list;
        //list()接收实现了FilenameFilter接口，将会匹配regex的文件名；
        //这其实是一个策略设计模式，list()实现了基本功能，而且按照FilenameFilter形式提供了这个策略，以
        //完善list()在提供服务时所需的算法，策略模式的目的就是提供了代码的行为灵活性
        list = path.list(new DirFilter("test*.*"));
        Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
        for (String dirItem : list) {
            System.out.println(dirItem);
        }
    }

    static class DirFilter implements FilenameFilter {
        private Pattern pattern;

        public DirFilter(String regex) {
            this.pattern = Pattern.compile(regex);
        }

        /**
         * 上面的list()方法会为此目录对象下的每个文件名调用accept()，来判断该文件是否包含在内
         */
        @Override
        public boolean accept(File dir, String name) {
            return pattern.matcher(name).matches();
        }
    }





}

/**
 * 使用匿名内部类改写上面的方法
 */
class DirFilter2 {
    public static void main(String[] args) {
        File path = new File(".");
        String[] list ;
        list = path.list(filter("test*.*"));
        Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
        for (String s : list) {
            System.out.println(s);
        }
    }

    /**
     * 匿名内部类引用外部变量必须是final的，因为所在的内存生命周期不同
     * @param regex
     * @return
     */
    public static FilenameFilter filter(final String regex) {
        return new FilenameFilter() {
            private Pattern pattern = Pattern.compile(regex);
            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(name).matches();
            }
        };
    }
}
